﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _18_Memento
{
    class Program
    {
        /*
         备忘录模式(Memento)：
         将保存的细节封装在Memento 中，哪天需要更改保存的细节，也不用影响客户端了

         Memento 模式比较适用于 功能比较复杂的，但需要维护或记录历史的类，或者需要保存的属性只是众多属性中的一小部分时，
         Originator 可以根据保存的Memento信息还原到前一状态

         如果在某个系统中使用命令模式，需要实现命令的撤销功能，那么命令模式可以使用备忘录模式来存储可撤销操作的状态。 
         有时一些对象的内部信息必须保存在对象以外的地方，但是必须要由对象自己读取，这时，使用备忘录可以把复杂的对象
         内部信息对其他的对象屏蔽起来，从而可以恰当的保持封闭状态

         备忘录模式：当存储对象大的时候，如果是内存存储，会很消耗内存
             */
        static void Main(string[] args)
        {
            /*运行时对象的状态*/
            Originator originator = new Originator();
            originator.State = "ON";
            originator.Show();

            /*保存状态 由于有了很好分封装性. 可以隐藏Originator的实现细节*/
            Caretaker caretaker = new Caretaker();
            caretaker.Memento = originator.CreateMemento();

            originator.State = "Off";
            originator.Show();

            originator.SetMemento(caretaker.Memento);
            originator.Show();
            Console.Read();
        }
    }
}
